/**
 * @file protocol_connection.h
 * @brief 104协议连接管理头文件
 * @details 本文件定义了104协议的连接管理功能，包括STARTDT、STOPDT、TESTFR
 *          等连接控制功能。实现完整的104协议连接建立、维护和释放逻辑。
 * 
 *          主要功能包括：
 *          - 连接状态管理：管理连接的生命周期状态
 *          - STARTDT/STOPDT控制：处理数据传输启动和停止
 *          - TESTFR心跳：维护连接活跃性
 *          - 超时管理：处理各种超时情况
 *          - 统计信息：记录连接相关的统计数据
 *          - 回调机制：支持状态变化和事件通知
 * 
 * @author 电网协议开发团队
 * @date 2024
 * @version 1.0
 * 
 * @note 本模块是104协议栈的核心组件，负责管理协议连接的生命周期
 * @warning 所有函数都是线程安全的，使用互斥锁保护共享数据
 * @see protocol_connection.c
 * @see protocol_types.h
 * @see error_codes.h
 */

#ifndef PROTOCOL_CONNECTION_H
#define PROTOCOL_CONNECTION_H

#include "../../common/types/include/protocol_types.h"
#include "../../common/error/include/error_codes.h"
#include <stdint.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

/* ==================== 连接状态定义 ==================== */

/**
 * @brief 104协议连接状态枚举
 * @details 定义了104协议连接管理器的所有可能状态，用于跟踪连接的生命周期。
 *          状态转换遵循104协议标准，确保连接管理的正确性和可靠性。
 */
typedef enum {
    CONNECTION_STATE_DISCONNECTED = 0,    /* 未连接状态：初始状态，未建立连接 */
    CONNECTION_STATE_CONNECTING,          /* 连接中状态：正在发送STARTDT请求 */
    CONNECTION_STATE_CONNECTED,           /* 已连接状态：连接已建立，可进行数据传输 */
    CONNECTION_STATE_DISCONNECTING,       /* 断开中状态：正在发送STOPDT请求 */
    CONNECTION_STATE_ERROR                /* 错误状态：连接出现错误，需要重新建立 */
} connection_state_t;

/**
 * @brief 连接事件类型枚举
 * @details 定义了104协议连接管理器中可能发生的各种事件类型，用于事件通知
 *          和回调处理。事件类型涵盖了连接控制、心跳检测、超时处理等各个方面。
 */
typedef enum {
    CONNECTION_EVENT_STARTDT_REQUEST = 0, /* STARTDT请求事件：请求启动数据传输 */
    CONNECTION_EVENT_STARTDT_CONFIRM,     /* STARTDT确认事件：确认启动数据传输 */
    CONNECTION_EVENT_STOPDT_REQUEST,      /* STOPDT请求事件：请求停止数据传输 */
    CONNECTION_EVENT_STOPDT_CONFIRM,      /* STOPDT确认事件：确认停止数据传输 */
    CONNECTION_EVENT_TESTFR_REQUEST,      /* TESTFR请求事件：请求测试帧 */
    CONNECTION_EVENT_TESTFR_CONFIRM,      /* TESTFR确认事件：确认测试帧 */
    CONNECTION_EVENT_TIMEOUT,             /* 超时事件：操作超时 */
    CONNECTION_EVENT_ERROR                /* 错误事件：发生错误 */
} connection_event_t;

/* ==================== 连接配置 ==================== */

/**
 * @brief 连接配置结构体
 * @details 定义了104协议连接管理器的配置参数，包括超时时间、重试策略、
 *          心跳设置等。所有时间参数以毫秒为单位，配置参数会影响连接
 *          的行为和性能特征。
 */
typedef struct {
    uint32_t startdt_timeout;             /* STARTDT超时时间(ms)：等待STARTDT确认的最大时间 */
    uint32_t stopdt_timeout;              /* STOPDT超时时间(ms)：等待STOPDT确认的最大时间 */
    uint32_t testfr_timeout;              /* TESTFR超时时间(ms)：等待TESTFR确认的最大时间 */
    uint32_t heartbeat_interval;          /* 心跳间隔(ms)：自动发送TESTFR的时间间隔 */
    uint32_t max_retry_count;             /* 最大重试次数：操作失败时的最大重试次数 */
    bool auto_heartbeat;                  /* 自动心跳：是否启用自动心跳功能 */
    bool auto_reconnect;                  /* 自动重连：是否启用自动重连功能 */
} connection_config_t;

/* ==================== 连接统计 ==================== */

/**
 * @brief 连接统计信息结构体
 * @details 记录了104协议连接管理器的运行统计信息，包括各种操作的计数、
 *          错误统计、重连次数等。统计信息用于监控连接状态、性能分析和
 *          故障诊断。所有计数器都是累积值，可以通过重置函数清零。
 */
typedef struct {
    uint64_t startdt_requests;            /* STARTDT请求次数：发送的STARTDT请求总数 */
    uint64_t startdt_confirms;            /* STARTDT确认次数：收到的STARTDT确认总数 */
    uint64_t stopdt_requests;             /* STOPDT请求次数：发送的STOPDT请求总数 */
    uint64_t stopdt_confirms;             /* STOPDT确认次数：收到的STOPDT确认总数 */
    uint64_t testfr_requests;             /* TESTFR请求次数：发送的TESTFR请求总数 */
    uint64_t testfr_confirms;             /* TESTFR确认次数：收到的TESTFR确认总数 */
    uint64_t timeouts;                    /* 超时次数：操作超时的总次数 */
    uint64_t errors;                      /* 错误次数：发生错误的总次数 */
    uint64_t reconnections;               /* 重连次数：自动重连的总次数 */
    uint32_t current_retry_count;         /* 当前重试次数：当前操作的重试次数 */
} connection_stats_t;

/* ==================== 连接句柄 ==================== */

/**
 * @brief 协议连接管理器句柄
 */
typedef struct protocol_connection_manager* protocol_connection_handle_t;

/* ==================== 回调函数类型 ==================== */

/**
 * @brief 连接状态变化回调函数类型
 * @details 当连接状态发生变化时调用的回调函数。应用程序可以注册此回调
 *          来接收状态变化通知，实现自定义的状态处理逻辑。
 * 
 * @param old_state 旧的状态
 * @param new_state 新的状态
 * @param user_data 用户数据指针
 */
typedef void (*connection_state_callback_t)(connection_state_t old_state, 
                                           connection_state_t new_state, 
                                           void* user_data);

/**
 * @brief 连接事件回调函数类型
 * @details 当连接事件发生时调用的回调函数。应用程序可以注册此回调
 *          来接收事件通知，实现自定义的事件处理逻辑。
 * 
 * @param event 事件类型
 * @param event_data 事件相关数据
 * @param user_data 用户数据指针
 * @return 协议错误码
 */
typedef protocol_error_t (*connection_event_callback_t)(connection_event_t event, 
                                                       const void* event_data, 
                                                       void* user_data);

/**
 * @brief APDU发送回调函数类型
 * @details 当需要发送APDU数据时调用的回调函数。应用程序必须注册此回调
 *          来实现实际的网络发送逻辑，连接管理器依赖此回调来发送数据。
 * 
 * @param apdu 要发送的APDU数据
 * @param user_data 用户数据指针
 * @return 协议错误码
 */
typedef protocol_error_t (*connection_send_callback_t)(const apdu_t* apdu, 
                                                      void* user_data);

/* ==================== 连接管理函数 ==================== */

/**
 * @brief 创建连接管理器
 * @details 创建并初始化一个新的104协议连接管理器实例。该函数会分配内存、
 *          验证配置参数、初始化内部状态和互斥锁，并设置初始的连接状态。
 *          连接管理器负责处理STARTDT、STOPDT、TESTFR等连接控制功能。
 * 
 * @param config 连接配置参数指针，不能为NULL
 * 
 * @return 连接管理器句柄，成功返回有效句柄，失败返回NULL
 * 
 * @note 创建的连接管理器需要调用protocol_connection_destroy()释放资源
 * @warning 配置参数必须通过protocol_connection_validate_config()验证
 * @see protocol_connection_destroy
 * @see protocol_connection_validate_config
 */
protocol_connection_handle_t protocol_connection_create(const connection_config_t* config);

/**
 * @brief 销毁连接管理器
 * @details 销毁连接管理器实例，清理所有相关资源。该函数会先停止连接管理器
 *          的运行，然后销毁互斥锁，最后释放内存。这是protocol_connection_create()
 *          的配对函数，用于释放连接管理器占用的所有资源。
 * 
 * @param handle 连接管理器句柄，不能为NULL
 * 
 * @return 协议错误码
 *         - PROTOCOL_SUCCESS: 销毁成功
 *         - PROTOCOL_ERROR_NULL_POINTER: 句柄为空指针
 * 
 * @note 调用此函数后，连接管理器句柄将变为无效，不应再使用
 * @warning 此函数会强制停止所有连接活动，请确保在合适的时机调用
 * @see protocol_connection_create
 */
protocol_error_t protocol_connection_destroy(protocol_connection_handle_t handle);

/**
 * @brief 启动连接
 * @details 启动104协议连接，发送STARTDT请求开始数据传输。该函数会检查当前连接状态，
 *          只有在断开状态下才能启动连接。启动过程包括状态转换、构建STARTDT APDU、
 *          发送请求并设置等待响应标志。如果配置了自动心跳，还会启动心跳线程。
 * 
 * @param handle 连接管理器句柄，不能为NULL
 * 
 * @return 协议错误码
 *         - PROTOCOL_SUCCESS: 启动成功
 *         - PROTOCOL_ERROR_NULL_POINTER: 句柄为空指针
 *         - PROTOCOL_ERROR_ALREADY_CONNECTED: 连接已存在
 *         - PROTOCOL_ERROR_SEND_FAILED: 发送STARTDT失败
 * 
 * @note 启动成功后，连接状态会变为CONNECTING，等待STARTDT确认
 * @warning 只有在DISCONNECTED状态下才能启动连接
 * @see protocol_connection_stop
 * @see protocol_connection_handle_apdu
 */
protocol_error_t protocol_connection_start(protocol_connection_handle_t handle);

/**
 * @brief 停止连接
 * @details 停止104协议连接，发送STOPDT请求停止数据传输。该函数会检查当前连接状态，
 *          如果已经断开则直接返回成功。停止过程包括状态转换、停止心跳线程、
 *          构建STOPDT APDU、发送请求并设置等待响应标志。如果发送失败，会直接
 *          转换到断开状态。
 * 
 * @param handle 连接管理器句柄，不能为NULL
 * 
 * @return 协议错误码
 *         - PROTOCOL_SUCCESS: 停止成功
 *         - PROTOCOL_ERROR_NULL_POINTER: 句柄为空指针
 *         - PROTOCOL_ERROR_SEND_FAILED: 发送STOPDT失败
 * 
 * @note 停止成功后，连接状态会变为DISCONNECTING，等待STOPDT确认
 * @warning 此函数会停止心跳线程，请确保在合适的时机调用
 * @see protocol_connection_start
 * @see protocol_connection_handle_apdu
 */
protocol_error_t protocol_connection_stop(protocol_connection_handle_t handle);

/**
 * @brief 发送测试帧
 * @details 发送TESTFR测试帧，用于连接保活和检测连接状态。该函数会检查当前连接状态，
 *          只有在已连接状态下才能发送测试帧。发送过程包括构建TESTFR APDU、
 *          发送请求并设置等待响应标志。测试帧用于维护连接的活跃性，防止连接超时。
 * 
 * @param handle 连接管理器句柄，不能为NULL
 * 
 * @return 协议错误码
 *         - PROTOCOL_SUCCESS: 发送成功
 *         - PROTOCOL_ERROR_NULL_POINTER: 句柄为空指针
 *         - PROTOCOL_ERROR_NOT_CONNECTED: 连接未建立
 *         - PROTOCOL_ERROR_SEND_FAILED: 发送失败
 * 
 * @note 测试帧发送成功后，会等待TESTFR确认
 * @warning 只有在CONNECTED状态下才能发送测试帧
 * @see protocol_connection_handle_apdu
 */
protocol_error_t protocol_connection_send_testfr(protocol_connection_handle_t handle);

/**
 * @brief 处理接收的APDU
 * @details 处理接收到的104协议APDU数据单元，主要处理U格式的控制帧。
 *          该函数会解析APDU类型，根据不同的U格式类型执行相应的处理逻辑，
 *          包括STARTDT、STOPDT、TESTFR的请求和确认处理。
 * 
 * @param handle 连接管理器句柄，不能为NULL
 * @param apdu 接收到的APDU数据单元，不能为NULL
 * 
 * @return 协议错误码
 *         - PROTOCOL_SUCCESS: 处理成功
 *         - PROTOCOL_ERROR_NULL_POINTER: 参数为空指针
 * 
 * @note 该函数会更新最后活动时间，用于心跳超时检测
 * @warning 该函数是线程安全的，使用互斥锁保护共享数据
 * @see protocol_connection_start
 * @see protocol_connection_stop
 * @see protocol_connection_send_testfr
 */
protocol_error_t protocol_connection_handle_apdu(protocol_connection_handle_t handle, 
                                                const apdu_t* apdu);

/* ==================== 状态查询函数 ==================== */

/**
 * @brief 获取连接状态
 * @details 获取当前连接管理器的连接状态。该函数是线程安全的，
 *          使用互斥锁保护共享数据的访问。
 * 
 * @param handle 连接管理器句柄，不能为NULL
 * 
 * @return 连接状态
 *         - CONNECTION_STATE_DISCONNECTED: 已断开
 *         - CONNECTION_STATE_CONNECTING: 连接中
 *         - CONNECTION_STATE_CONNECTED: 已连接
 *         - CONNECTION_STATE_DISCONNECTING: 断开中
 *         - CONNECTION_STATE_ERROR: 错误状态
 *         - 如果句柄为NULL，返回CONNECTION_STATE_ERROR
 * 
 * @note 该函数是线程安全的
 * @see protocol_connection_is_connected
 */
connection_state_t protocol_connection_get_state(protocol_connection_handle_t handle);

/**
 * @brief 检查是否已连接
 * @details 检查连接管理器是否处于已连接状态。这是一个便捷函数，
 *          用于快速判断连接状态。
 * 
 * @param handle 连接管理器句柄，不能为NULL
 * 
 * @return 连接状态
 *         - true: 已连接
 *         - false: 未连接或句柄为NULL
 * 
 * @note 该函数内部调用protocol_connection_get_state()
 * @see protocol_connection_get_state
 */
bool protocol_connection_is_connected(protocol_connection_handle_t handle);

/**
 * @brief 获取连接统计信息
 * @details 获取连接管理器的统计信息，包括各种操作的计数和状态。
 *          该函数是线程安全的，使用互斥锁保护共享数据的访问。
 * 
 * @param handle 连接管理器句柄，不能为NULL
 * @param stats 统计信息输出缓冲区，不能为NULL
 * 
 * @return 协议错误码
 *         - PROTOCOL_SUCCESS: 获取成功
 *         - PROTOCOL_ERROR_NULL_POINTER: 参数为空指针
 * 
 * @note 该函数是线程安全的
 * @see connection_stats_t
 */
protocol_error_t protocol_connection_get_stats(protocol_connection_handle_t handle, 
                                             connection_stats_t* stats);

/* ==================== 回调设置函数 ==================== */

/**
 * @brief 设置连接状态回调函数
 * @details 设置连接状态变化时的回调函数。当连接状态发生变化时，
 *          系统会自动调用此回调函数通知应用程序。回调函数会在状态
 *          变化后立即被调用，应用程序可以在此函数中处理状态变化事件。
 * 
 * @param handle 连接管理器句柄，不能为NULL
 * @param callback 状态变化回调函数指针，可以为NULL（表示取消回调）
 * @param user_data 用户数据指针，会传递给回调函数，可以为NULL
 * 
 * @return 协议错误码
 *         - PROTOCOL_SUCCESS: 设置成功
 *         - PROTOCOL_ERROR_NULL_POINTER: 句柄为空指针
 * 
 * @note 该函数是线程安全的，使用互斥锁保护共享数据
 * @note 如果callback为NULL，则取消状态回调
 * @warning 回调函数应该尽快返回，避免阻塞连接管理器
 * @see connection_state_callback_t
 * @see protocol_connection_set_event_callback
 * @see protocol_connection_set_send_callback
 */
protocol_error_t protocol_connection_set_state_callback(protocol_connection_handle_t handle, 
                                                       connection_state_callback_t callback, 
                                                       void* user_data);

/**
 * @brief 设置连接事件回调函数
 * @details 设置连接事件发生时的回调函数。当连接管理器检测到特定事件
 *          （如STARTDT请求、STOPDT确认、TESTFR超时等）时，系统会自动
 *          调用此回调函数通知应用程序。应用程序可以在此函数中处理各种
 *          连接事件，实现自定义的事件处理逻辑。
 * 
 * @param handle 连接管理器句柄，不能为NULL
 * @param callback 事件处理回调函数指针，可以为NULL（表示取消回调）
 * @param user_data 用户数据指针，会传递给回调函数，可以为NULL
 * 
 * @return 协议错误码
 *         - PROTOCOL_SUCCESS: 设置成功
 *         - PROTOCOL_ERROR_NULL_POINTER: 句柄为空指针
 * 
 * @note 该函数是线程安全的，使用互斥锁保护共享数据
 * @note 如果callback为NULL，则取消事件回调
 * @warning 回调函数应该尽快返回，避免阻塞连接管理器
 * @see connection_event_callback_t
 * @see protocol_connection_set_state_callback
 * @see protocol_connection_set_send_callback
 */
protocol_error_t protocol_connection_set_event_callback(protocol_connection_handle_t handle, 
                                                       connection_event_callback_t callback, 
                                                       void* user_data);

/**
 * @brief 设置APDU发送回调函数
 * @details 设置APDU数据发送时的回调函数。当连接管理器需要发送APDU数据
 *          （如STARTDT、STOPDT、TESTFR等控制帧）时，系统会调用此回调函数
 *          将APDU数据传递给底层传输层进行实际发送。应用程序需要在此回调
 *          函数中实现具体的网络发送逻辑。
 * 
 * @param handle 连接管理器句柄，不能为NULL
 * @param callback APDU发送回调函数指针，不能为NULL（连接管理器需要此回调来发送数据）
 * @param user_data 用户数据指针，会传递给回调函数，可以为NULL
 * 
 * @return 协议错误码
 *         - PROTOCOL_SUCCESS: 设置成功
 *         - PROTOCOL_ERROR_NULL_POINTER: 句柄为空指针
 * 
 * @note 该函数是线程安全的，使用互斥锁保护共享数据
 * @note send_callback不能为NULL，连接管理器依赖此回调发送APDU数据
 * @warning 回调函数应该尽快返回，避免阻塞连接管理器
 * @see connection_send_callback_t
 * @see protocol_connection_set_state_callback
 * @see protocol_connection_set_event_callback
 */
protocol_error_t protocol_connection_set_send_callback(protocol_connection_handle_t handle, 
                                                      connection_send_callback_t callback, 
                                                      void* user_data);

/* ==================== 配置管理函数 ==================== */

/**
 * @brief 更新连接配置参数
 * @details 更新连接管理器的配置参数，包括超时时间、重试次数、心跳间隔等。
 *          该函数会验证新配置的有效性，只有通过验证的配置才会被应用。
 *          配置更新是原子操作，使用互斥锁保护，确保配置的一致性。
 * 
 * @param handle 连接管理器句柄，不能为NULL
 * @param config 新的连接配置参数，不能为NULL
 * 
 * @return 协议错误码
 *         - PROTOCOL_SUCCESS: 更新成功
 *         - PROTOCOL_ERROR_NULL_POINTER: 参数为空指针
 *         - PROTOCOL_ERROR_INVALID_PARAM: 配置参数无效
 * 
 * @note 该函数是线程安全的，使用互斥锁保护共享数据
 * @note 配置更新会立即生效，影响后续的连接操作
 * @warning 配置更新不会影响当前正在进行的连接操作
 * @see connection_config_t
 * @see protocol_connection_validate_config
 * @see protocol_connection_get_config
 */
protocol_error_t protocol_connection_update_config(protocol_connection_handle_t handle, 
                                                  const connection_config_t* config);

/**
 * @brief 获取连接配置参数
 * @details 获取连接管理器的当前配置参数，包括超时时间、重试次数、心跳间隔等。
 *          该函数会复制当前的配置参数到提供的缓冲区中，应用程序可以查看
 *          当前的配置设置。配置获取是原子操作，使用互斥锁保护，确保数据的一致性。
 * 
 * @param handle 连接管理器句柄，不能为NULL
 * @param config 配置参数输出缓冲区，不能为NULL
 * 
 * @return 协议错误码
 *         - PROTOCOL_SUCCESS: 获取成功
 *         - PROTOCOL_ERROR_NULL_POINTER: 参数为空指针
 * 
 * @note 该函数是线程安全的，使用互斥锁保护共享数据
 * @note 获取的配置是当前生效的配置参数
 * @see connection_config_t
 * @see protocol_connection_update_config
 * @see protocol_connection_validate_config
 */
protocol_error_t protocol_connection_get_config(protocol_connection_handle_t handle, 
                                               connection_config_t* config);

/* ==================== 辅助函数 ==================== */

/**
 * @brief 获取连接状态名称字符串
 * @details 将连接状态枚举值转换为对应的字符串名称，用于日志记录和调试。
 *          该函数返回静态字符串数组中的对应项，返回的字符串指针在程序
 *          运行期间保持有效，不需要释放内存。
 * 
 * @param state 连接状态枚举值
 * 
 * @return 状态名称字符串
 *         - "DISCONNECTED": 已断开状态
 *         - "CONNECTING": 连接中状态
 *         - "CONNECTED": 已连接状态
 *         - "DISCONNECTING": 断开中状态
 *         - "ERROR": 错误状态
 *         - "UNKNOWN": 未知状态（当state值无效时）
 * 
 * @note 返回的字符串指针是静态的，不需要释放内存
 * @note 该函数是线程安全的，只读取静态数据
 * @see connection_state_t
 * @see protocol_connection_get_event_name
 */
const char* protocol_connection_get_state_name(connection_state_t state);

/**
 * @brief 获取连接事件名称字符串
 * @details 将连接事件枚举值转换为对应的字符串名称，用于日志记录和调试。
 *          该函数返回静态字符串数组中的对应项，返回的字符串指针在程序
 *          运行期间保持有效，不需要释放内存。
 * 
 * @param event 连接事件枚举值
 * 
 * @return 事件名称字符串
 *         - "STARTDT_REQUEST": STARTDT请求事件
 *         - "STARTDT_CONFIRM": STARTDT确认事件
 *         - "STOPDT_REQUEST": STOPDT请求事件
 *         - "STOPDT_CONFIRM": STOPDT确认事件
 *         - "TESTFR_REQUEST": TESTFR请求事件
 *         - "TESTFR_CONFIRM": TESTFR确认事件
 *         - "TIMEOUT": 超时事件
 *         - "ERROR": 错误事件
 *         - "UNKNOWN": 未知事件（当event值无效时）
 * 
 * @note 返回的字符串指针是静态的，不需要释放内存
 * @note 该函数是线程安全的，只读取静态数据
 * @see connection_event_t
 * @see protocol_connection_get_state_name
 */
const char* protocol_connection_get_event_name(connection_event_t event);

/**
 * @brief 验证连接配置参数的有效性
 * @details 验证连接配置参数是否符合104协议的要求和系统限制。
 *          该函数会检查所有必要的配置参数，确保它们的值在有效范围内。
 *          验证包括超时时间、重试次数等关键参数的合理性检查。
 * 
 * @param config 待验证的连接配置参数，不能为NULL
 * 
 * @return 协议错误码
 *         - PROTOCOL_SUCCESS: 配置验证通过
 *         - PROTOCOL_ERROR_NULL_POINTER: 配置参数为空指针
 *         - PROTOCOL_ERROR_INVALID_PARAM: 配置参数无效
 * 
 * @note 该函数是线程安全的，只读取配置数据
 * @note 验证规则：
 *       - 所有超时时间必须大于0
 *       - 最大重试次数必须大于0
 *       - 心跳间隔必须大于0（如果启用自动心跳）
 * @see connection_config_t
 * @see protocol_connection_update_config
 * @see protocol_connection_get_config
 */
protocol_error_t protocol_connection_validate_config(const connection_config_t* config);

/**
 * @brief 重置连接统计信息
 * @details 将连接管理器的所有统计信息重置为零。该函数会清空所有计数器，
 *          包括STARTDT、STOPDT、TESTFR的请求和确认次数，以及错误计数等。
 *          重置操作是原子操作，使用互斥锁保护，确保数据的一致性。
 * 
 * @param handle 连接管理器句柄，不能为NULL
 * 
 * @return 协议错误码
 *         - PROTOCOL_SUCCESS: 重置成功
 *         - PROTOCOL_ERROR_NULL_POINTER: 句柄为空指针
 * 
 * @note 该函数是线程安全的，使用互斥锁保护共享数据
 * @note 重置后所有统计计数器都将变为0
 * @warning 重置操作不可逆，请谨慎使用
 * @see connection_stats_t
 * @see protocol_connection_get_stats
 */
protocol_error_t protocol_connection_reset_stats(protocol_connection_handle_t handle);

#ifdef __cplusplus
}
#endif

#endif /* PROTOCOL_CONNECTION_H */
